package com.luxsoft.em2;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

import com.luxsoft.utils.LoggerHelper;

/**
 * Facade para acceso a todos los servicios del sistema
 * 
 * @author Ruben Cancino Ramos
 *
 */
public class EM2ServiceLocator {
	
	private static EM2ServiceLocator INSTANCE;
	
	static Logger logger=LoggerHelper.getLogger();
	ApplicationContext context;
	
	private EM2ServiceLocator (){
		init();
	}
	
	private void init(){
		logger.info("Inicializando contexto de spring para servicios EM2 ");
		context=new ClassPathXmlApplicationContext(
				"classpath:spring/em2-jms-context.xml"
				);
	}
	
	public static EM2ServiceLocator getInstance(){
		if(INSTANCE==null){
			INSTANCE=new EM2ServiceLocator();
		}
		return INSTANCE;
	}
	
	/**
	 * Acceso al JMS jmsTemplate principal para los servicios JMS
	 * normalmente ubicado en el mismo servidor que el EnterpriseManager
	 * 
	 * @return
	 */
	public static synchronized JmsTemplate getJmsTemplate(){
		return (JmsTemplate)getInstance().context.getBean("jmsTemplate");
	}
	
	public static synchronized void sendJmsTextMessage(final String message,String destino,boolean subPubDomain){
		getJmsTemplate().send(destino, new MessageCreator() {			
			public Message createMessage(Session session) throws JMSException {
				TextMessage tm=session.createTextMessage(message);	
				tm.setStringProperty("Type", "TextMessage");
				return tm;
			}
		});
	}
	
	public static synchronized String lookupJmsTextMessage(String destino,boolean subDomain){
		String res=(String)getJmsTemplate().receiveSelectedAndConvert(destino, "Type=TextMessage");
		return res;
		/*
		try {
			return res.getText();
		} catch (JMSException e) {
			throw JmsUtils.convertJmsAccessException(e);
		}*/
		/*
		Message message=getJmsTemplate().receiveSelected(destino, );
		TextMessage tm=(TextMessage)message;
		return tm.getText();*/
	}
	
	/**
	 * Manda mensaje de prueba para JMS para verificar el funcionamiento de JMS
	 * El mensaje es enviado al destino queue: em2.jms.test
	 * @param text
	 */
	public static void testMessage(String message){
		String queue="em2.jms.test";
		logger.info("Mensaje JMS de prueba: "+message+" enviado a queue: "+queue);
		sendJmsTextMessage(message, queue, false);
		
	}
	
	public static void main(String[] args) {
		//testMessage("PRUEBA 1");
		String res=lookupJmsTextMessage("em2.jms.test", false);
		logger.info("Mensaje recibido: "+res);
		
	}

}
